import axios from 'axios'
import {
  ElMessage
} from 'element-plus'
import router from '@/router'
import store from '@/store'

const instance = axios.create({
  baseURL: import.meta.env.VITE_API_URL,
  timeout: 10000,
})

console.log("baseURL", import.meta.env.VITE_API_URL)

instance.defaults.headers.post['Content-Type'] = 'application/json'


/** 添加请求拦截器 **/
instance.interceptors.request.use(config => {
  config.headers.token = store.state.token
  if (config.method === 'get') { // 添加时间戳参数，防止浏览器（IE）对get请求的缓存
    config.params = {
      ...config.params,
      t: new Date().getTime()
    }
  }
  if (config.url.includes('/invoice/info')) {
    config.headers['Content-Type'] = 'multipart/form-data'
  }
  return config
}, error => {
  return Promise.reject(error)
})

/** 添加响应拦截器  **/
instance.interceptors.response.use(response => {
  if (response.status === 200) {
    return Promise.resolve(response.data)
  } else {
    return Promise.reject(response.data)
  }
}, error => {
  console.log('error:', error)
  if (error && error.response && error.response.status) {
    switch (error.response.status) {
      //请求参数不正确
      case 400:
        ElMessage.error(`请求参数错误:${error.response.data.message[0].msg}`)
        break;
      // 401: 未登录
      // 未登录则跳转登录页面，并携带当前页面的路径
      // 在登录成功后返回当前页面，这一步需要在登录页操作。                
      case 401:
        ElMessage.error('未登录，请先登录!')
        router.replace({
          path: '/login',
          query: {
            redirect: router.currentRoute.fullPath
          }
        });
        break;

      // 403 token过期
      // 登录过期对用户进行提示
      // 清除本地token和清空vuex中token对象
      // 跳转登录页面                
      case 403:
        ElMessage.error('登录过期，请重新登录!');
        // 清除token
        localStorage.removeItem('token');
        store.commit('clearInfo');
        // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面 
        setTimeout(() => {
          router.replace({
            path: '/login',
            query: {
              redirect: router.currentRoute.fullPath
            }
          });
        }, 1000);
        break;

      // 404请求不存在
      case 404:
        ElMessage.error('网络请求不存在!');
        break;
      // 其他错误，直接抛出错误提示
      default:
        ElMessage.error(error.response.data.message);
    }
    return Promise.reject(error.response);
  } else {
    ElMessage.error(error);
    return Promise.reject(error)
  }
})

/* 统一封装get请求 */
export const get = (url, params, config = {}) => {
  return new Promise((resolve, reject) => {
    instance({
      method: 'get',
      url,
      params,
      ...config
    }).then(response => {
      resolve(response)
    }).catch(error => {
      reject(error)
    })
  })
}

/* 统一封装post请求  */
export const post = (url, data, config = {}) => {
  return new Promise((resolve, reject) => {
    instance({
      method: 'post',
      url,
      data,
      ...config
    }).then(response => {
      resolve(response)
    }).catch(error => {
      reject(error)
    })
  })
}
